﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ENT.GP.Core;
using ENT.GP.Core.Lookup;
using System.Configuration;
using Coolite.Ext.Web;
using System.Collections;
using ENT.GP.Core.Proyecto;
using ENT.GP.Core.Core;
using entgp.Code;

public partial class Proyectos_Perfiles_wucPerfiles : System.Web.UI.UserControl
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack && !Ext.IsAjaxRequest)
        {
            CargarControles();
        }
    }



    private void CargarControles()
    {

        SectorLookup.InvalidateCache();

        sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString());
        sRegion.DataBind();
        sSectores.DataSource = SectorLookup.GetNameValueList();
        sSectores.DataBind();


    }

    /// <summary>
    /// Muestra la ventana de Creacion de un nuevo perfil de Proyecto
    /// </summary>
    /// <param name="Operacion">Operacion que se realizara</param>
    public void Show(string Operacion)
    {
        Show(Operacion, 0);
    }



    /// <summary>
    /// Muestra la ventana para la modificacion de un nuevo perfil de proyecto
    /// </summary>
    /// <param name="Operacion">Operacion que se realizara</param>
    /// <param name="Id">Id del Perfil del Proyecto</param>
    public void Show(string Operacion, int Id)
    {
        if (Operacion == "Editar" || Operacion=="Eliminar")
        {
            this.hidAccion.SetValue(Operacion);
            this.hidIdPerfilProyecto.SetValue(Id);
            Proyecto objProyecto = Proyecto.GetProyecto(Id);
            txtNombreProyecto.SetValue(objProyecto.Nombre);
            txaDescripcion.SetValue(objProyecto.DescripcionAdicional);

            cbxEjes.SetValue(objProyecto.Eje);
            cbxPrograma.SetValue(objProyecto.Programa);
            txtLatitud.SetValue(objProyecto.Latitud);
            txtLongitud.SetValue(objProyecto.Longitud);
            sRegion.DataSource = RegionLookup.GetNameValueList(ConfigurationManager.AppSettings.Get("CodigoRegionSenplades").ToString());
            sRegion.DataBind();
            CargarCantones(objProyecto.Provincia);
            CargarProvincias(objProyecto.Region);

            cbxRegion.SetValue(objProyecto.Region);
            cbxProvincia.SetValue(objProyecto.Provincia);
            cbxCanton.SetValue(objProyecto.Canton);
            txtParroquia.SetValue(objProyecto.Parroquia);
            txtInversionTotal.Number = objProyecto.CostoTotal;
            txtValPlan.Number = objProyecto.AportePlan;
            txtValContraparte.Number = objProyecto.AporteContraparte;
            txtValContraparte2.Number = objProyecto.AporteContraparte2;

            txtPorcenPlan.Number = Math.Round((100 * objProyecto.AportePlan) / objProyecto.CostoTotal, 2);
            txtPorcenContraparte.Number = Math.Round((100 * objProyecto.AporteContraparte) / objProyecto.CostoTotal, 2);
            txtPorcenContraparte2.Number = Math.Round((100 * objProyecto.AporteContraparte2) / objProyecto.CostoTotal, 2);

            switch (objProyecto.PoblacionAfectada)
            {
                case 605:
                    rUrbano.SetValue(true);
                    rUrbanoMarginal.SetValue(false);
                    rRural.SetValue(false);
                    break;
                case 606:
                    rUrbanoMarginal.SetValue(true);
                    rRural.SetValue(false);
                    rUrbano.SetValue(false);
                    break;
                case 607:
                    rRural.SetValue(true);
                    rUrbano.SetValue(false);
                    rUrbanoMarginal.SetValue(false);
                    break;
            }
            if (objProyecto.Dictamen == "SI")
            {
                radSi.SetValue(true);
                radNo.SetValue(false);
            }
            else
            {
                radSi.SetValue(false);
                radNo.SetValue(true);
            }
            if (objProyecto.Viabilidad == "SI")
            {
                radSiVT.SetValue(true);
                radNoVT.SetValue(false);
            }
            else
            {
                radSiVT.SetValue(false);
                radNoVT.SetValue(true);
            }
            StoreDocumentos.DataSource = objProyecto.DocumentosPerfil;
            StoreDocumentos.DataBind();
            StoreDocumentosDP.DataSource = objProyecto.DocumentosPerfilDictamen;
            StoreDocumentosDP.DataBind();
            StoreDocumentosVT.DataSource = objProyecto.DocumentosPerfilViabilidad;
            StoreDocumentosVT.DataBind();
            StoreSector.RemoveAll();
            StoreSector.DataSource = objProyecto.Sectores;
            StoreSector.DataBind();
            sSectores.RemoveAll();
            sSectores.DataSource = SectorLookup.GetNameValueList();
            sSectores.DataBind();

            WinPerfilProyecto.AddScript("MarcarSectores();");

            if (Operacion=="Eliminar")
            {
                btnGuardar.Hide();
                btnEliminar.Show();
                btnEDP.Hide();
                btnEVT.Hide();
            }
            else
            {
                btnGuardar.Show();
                btnEliminar.Hide();
                btnEDP.Show();
                btnEVT.Show();
            }
        }
        else if (Operacion == "Nuevo")
        {
            btnEliminar.Hide();
            this.hidAccion.Text = Operacion;
            this.hidIdPerfilProyecto.SetValue("0");
        }
        WinPerfilProyecto.Show();
    }

    protected void btnEliminar_Click(object sender, AjaxEventArgs e)
    {
        
        try
        {
            var proyecto = Proyecto.GetProyecto(Convert.ToInt32(hidIdPerfilProyecto.Text));
            proyecto.Delete();
            proyecto = proyecto.Save();
            Ext.Msg.Show(new MessageBox.Config
            {
                Title = "Creacion del Perfil",
                Message = "El Perfil del proyecto se elimino correctamente",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO
            });
            LimpiarFormulario();
        }
        catch (Exception ex)
        {
            Ext.Msg.Show(new MessageBox.Config
            {
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR,
                Title = "Fallo",
                Message = "Ocurrio un error al eliminar Perfil"
            });
            Util.RegistarLog(ex.ToString());
        }
    }
    
    protected void btnGuardar_Click(object sender, AjaxEventArgs e)
    {
        string DocP, DocDP, DocVT, Sectores;
        
        bool ovt=false, odp=false;
        try
        {
            
            var tiposP = TipoLookup.GetNameValueList();
            DocP = e.ExtraParams["DocumentosP"];
            DocDP = e.ExtraParams["DocumentosDP"];
            DocVT = e.ExtraParams["DocumentosVT"];
            Sectores = e.ExtraParams["Sectores"];
            Proyecto proyecto;
            if (this.hidAccion.Text == "Editar")
            {
                proyecto = Proyecto.GetProyecto(Convert.ToInt32(hidIdPerfilProyecto.Text));
            }
            else
            {
                proyecto = Proyecto.NewProyecto();
                proyecto.FechaInicio=null;
                proyecto.FechaFin = null;

            }
            //Datos Generales
            proyecto.Nombre = txtNombreProyecto.Text;
            proyecto.DescripcionAdicional = txaDescripcion.Text;
            proyecto.Tipo = tiposP[1].Key;

            proyecto.Observacion = "";
            proyecto.Estado = 279;
            //Datos Localizacion      //proyecto.Pais = cbxPais.SelectedIndex;
            proyecto.Latitud = txtLatitud.Number;
            proyecto.Longitud = txtLongitud.Number;
            proyecto.Region = Convert.ToInt32(cbxRegion.SelectedItem.Value);
            proyecto.Provincia = Convert.ToInt32(cbxProvincia.SelectedItem.Value);
            proyecto.Canton = Convert.ToInt32(cbxCanton.SelectedItem.Value);
            proyecto.Parroquia = txtParroquia.Text;
            //if (proyecto.FechaFin.Value.Year==1)
            //{
            //  proyecto.FechaFin = null;  
            //}
            //if (proyecto.FechaInicio.Value.Year==1)
            //{
            //    proyecto.FechaInicio = null;
            //}
            //proyecto.FechaFin = null;
            //proyecto.FechaInicio = null;
            //Sector Estartegico
            StoreDataHandler sdhSectores = new StoreDataHandler(Sectores);
            ChangeRecords<ProyectoSector> crSectores = sdhSectores.ObjectData<ProyectoSector>();
            foreach (var sector in crSectores.Deleted)
            {
                int indice = proyecto.Sectores.IndexOf(proyecto.Sectores.FirstOrDefault(x => x.Id == sector.Id));
                proyecto.Sectores.RemoveAt(indice);
            }
            foreach (var sector in crSectores.Created)
            {
                proyecto.Sectores.Add(sector);
            }

            proyecto.Eje = Convert.ToInt32(cbxEjes.SelectedItem.Value);
            proyecto.Programa = Convert.ToInt32(cbxPrograma.SelectedItem.Value);

            //Descripcion Aporte
            proyecto.CostoTotal = txtInversionTotal.Number;
            proyecto.AportePlan = txtValPlan.Number;
            proyecto.AporteContraparte = txtValContraparte.Number;
            proyecto.AporteContraparte2 = txtValContraparte2.Number;

            //Area Poblacion Afectada
            if (rUrbano.Checked)
                proyecto.PoblacionAfectada = 605;
            if (rUrbanoMarginal.Checked)
                proyecto.PoblacionAfectada = 606;
            if (rRural.Checked)
                proyecto.PoblacionAfectada = 607;

            //Documentos del perfil
            StoreDataHandler sdhDocP = new StoreDataHandler(DocP);
            ChangeRecords<DocumentoPerfil> crDocp = sdhDocP.ObjectData<DocumentoPerfil>();

            foreach (var doc in crDocp.Deleted)
            {
                int indice = proyecto.DocumentosPerfil.IndexOf(proyecto.DocumentosPerfil.FirstOrDefault(x => x.Id == doc.Id));
                proyecto.DocumentosPerfil.RemoveAt(indice);
            }

            foreach (var docp in crDocp.Created)
            {
                proyecto.DocumentosPerfil.Add(docp);
            }

            //Datos del Dictamen de Prioridad del perfil
            if (radSi.Checked)
            {
                proyecto.Dictamen = "SI";
                odp = true;
            }
            if (radNo.Checked)
            {
                proyecto.Dictamen = "NO";
                odp = false;
            }

            //Documentos del Dictamen de Prioridad del perfil
            StoreDataHandler sdhDocDP = new StoreDataHandler(DocDP);
            ChangeRecords<DocumentoPerfilDictamen> crsdhDocDP = sdhDocDP.ObjectData<DocumentoPerfilDictamen>();

            foreach (var doc in crsdhDocDP.Deleted)
            {
                int indice = proyecto.DocumentosPerfilDictamen.IndexOf(proyecto.DocumentosPerfilDictamen.FirstOrDefault(x => x.Id == doc.Id));
                proyecto.DocumentosPerfilDictamen.RemoveAt(indice);
            }

            foreach (DocumentoPerfilDictamen docdp in crsdhDocDP.Created)
            {
                proyecto.DocumentosPerfilDictamen.Add(docdp);
            }

            //Datos de la Viabilidad Tecnica
            if (radSiVT.Checked)
            {
                proyecto.Viabilidad = "SI";
                ovt = true;
            }
            if (radNoVT.Checked)
            {
                proyecto.Viabilidad = "NO";
                ovt = false;
            }

            //Documentos de la Viabilidad tecnica del perfil
            StoreDataHandler sdhDocVT = new StoreDataHandler(DocVT);
            ChangeRecords<DocumentoPerfilViabilidad> crDocVT = sdhDocVT.ObjectData<DocumentoPerfilViabilidad>();

            foreach (var doc in crDocVT.Deleted)
            {
                int indice = proyecto.DocumentosPerfilViabilidad.IndexOf(proyecto.DocumentosPerfilViabilidad.FirstOrDefault(x => x.Id == doc.Id));
                proyecto.DocumentosPerfilViabilidad.RemoveAt(indice);
            }

            foreach (DocumentoPerfilViabilidad docvt in crDocVT.Created)
            {
                proyecto.DocumentosPerfilViabilidad.Add(docvt);
            }

            proyecto = proyecto.Save();
            if (hidAccion.Text=="Editar")
            {
                if (ovt)
                {                    
                    RegistrarNotificacion(proyecto.IDProyecto, string.Format("El proyecto {0} ya tiene Viabilidad Técnica", proyecto.Nombre), "Viabilidad Técnica");
                }
                if (odp)
                {
                   RegistrarNotificacion(proyecto.IDProyecto, string.Format("El proyecto {0} ya tiene Dictamen de Prioridad", proyecto.Nombre), "Dictamen de Prioridad");
                }
            }
            else
            {
                if (hidAccion.Text == "Nuevo")
                {
                    RegistrarNotificacion(proyecto.IDProyecto,string.Format("El perfil de proyecto {0} fue creado", proyecto.Nombre), "Creación de Nuevo Perfil de Proyecto");
                }
                if (ovt)
                {
                    RegistrarNotificacion(proyecto.IDProyecto, string.Format("El proyecto {0} ya tiene Viabilidad Técnica", proyecto.Nombre), "Viabilidad Técnica");
                }
                if (odp)
                {
                    RegistrarNotificacion(proyecto.IDProyecto, string.Format("El proyecto {0} ya tiene Dictamen de Prioridad", proyecto.Nombre), "Dictamen de Prioridad");
                }
            }
            Ext.Msg.Show(new MessageBox.Config
            {
                Title = "Creacion del Perfil",
                Message = "El Perfil del proyecto se guardo correctamente",
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.INFO
            });
            LimpiarFormulario();
        }
        catch (Exception ex)
        {
            Ext.Msg.Show(new MessageBox.Config
            {
                Buttons = MessageBox.Button.OK,
                Icon = MessageBox.Icon.ERROR,
                Title = "Fallo",
                Message = "Ocurrio un error al guardar Perfil, revise que todo los campos esten completos"
            });
            Util.RegistarLog(ex.ToString());
        }
    }

    void RegistrarNotificacion(int idProyecto,string nombre,string accion)
    {
        int idRol;
        int.TryParse(Session["IdRol"].ToString(), out idRol);
        var notificaViabilidad = ENT.GP.Core.Tareas.Tareas.NuevaTarea();
        notificaViabilidad.IdProyecto = idProyecto;
        notificaViabilidad.Nombre = accion;
        notificaViabilidad.Descripcion = nombre;
        notificaViabilidad.Fecha = DateTime.Now;
        notificaViabilidad.IdRol = idRol;
        notificaViabilidad=notificaViabilidad.Save();
    }

    #region "Muestra el listado de la Ubicacion : Provincias y Cantones"

    protected void CantonRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            CargarCantones(Convert.ToInt32(cbxProvincia.SelectedItem.Value));
        }
        catch { }

    }
    protected void ProvinciaRefresh(object sender, StoreRefreshDataEventArgs e)
    {
        try
        {
            CargarProvincias(Convert.ToInt32(cbxRegion.SelectedItem.Value));
        }
        catch { }
    }
    private void CargarCantones(int Id)
    {
        CantonLookup.InvalidateCache();
        this.sCanton.DataSource = CantonLookup.GetNameValueList(Id);
        this.sCanton.DataBind();
    }
    private void CargarProvincias(int Id)
    {
        ProvinciaLookup.InvalidateCache();
        this.sProvincia.DataSource = ProvinciaLookup.GetNameValueList(Id);
        this.sProvincia.DataBind();
    }

    #endregion

    #region "Manejo de operaciones con Archivos: Agregar, Quitar del Perfil"

    protected void CommandVer_Click(object sender, AjaxEventArgs e)
    {
        try
        {
            //string ruta = string.Format("{0}{1}", UtilP.RUTA_ARCHIVOS, e.ExtraParams["Nombre"]);
            string ruta = string.Format("{0}{1}", UtilP.RUTA_ARCHIVOS, e.ExtraParams["Nombre"]);
            winVerArchivo.LoadContent(ruta);
            winVerArchivo.SetTitle(e.ExtraParams["Nombre"]);

            winVerArchivo.Show();
        }
        catch (Exception ex)
        {
            Util.RegistarLog(ex.ToString());
        }
    }

    public void SubirArchivo_Click(object sender, AjaxEventArgs e)
    {
        string mensaje = "";
        try
        {
            string nombre = "";
            nombre = fufArchivosPP.PostedFile.FileName;
            nombre = UtilP.FormarNombre(nombre);

            fufArchivosPP.PostedFile.SaveAs(MapPath(string.Format("~/{0}{1}", ConfigurationManager.AppSettings.Get("PathFiles"), nombre)));
            fufArchivosPP.SetValue(nombre);

            if (this.fufArchivosPP.HasFile)
            {
                mensaje = string.Format("Subido el archivo Correctamente: {0}<br/>Size: {1} bytes", this.fufArchivosPP.PostedFile.FileName, this.fufArchivosPP.PostedFile.ContentLength);
                UtilP.MostrarNotificacion(mensaje, "Subir Archivo", MessageBox.Icon.INFO);

                hiTipoDoc.SetValue(this.fufArchivosPP.PostedFile.ContentType);
                hiTamano.SetValue(this.fufArchivosPP.PostedFile.ContentLength);
                hiRuta.SetValue(nombre);
                hiTipo.SetValue(txtTipoDocumento.Text);
            }
            else
                UtilP.MostrarNotificacion("Archivo no fue subido!!!", "Subir Archivo", MessageBox.Icon.ERROR);
        }
        catch 
        {
            UtilP.MostrarNotificacion("Archivo no fue subido!!!", "Subir Archivo", MessageBox.Icon.ERROR);
        }
    }

    public void SubirArchivoDP_Click(object sender, AjaxEventArgs e)
    {
        string mensaje = "Subido el archivo Correctamente: {0}<br/>Size: {1} bytes";
        try
        {
            string nombre = "";
            nombre = fufArchivosDP.PostedFile.FileName;
            nombre = UtilP.FormarNombre(nombre);
            fufArchivosDP.PostedFile.SaveAs(MapPath(string.Format("~/{0}{1}", ConfigurationManager.AppSettings.Get("PathFiles"), nombre)));
            fufArchivosDP.SetValue(nombre);
            if (this.fufArchivosDP.HasFile)
            {
                mensaje = string.Format("Subido el archivo Correctamente: {0}<br/>Size: {1} bytes", this.fufArchivosDP.PostedFile.FileName, this.fufArchivosDP.PostedFile.ContentLength);
                UtilP.MostrarNotificacion(mensaje, "Subir Archivo", MessageBox.Icon.INFO);

                hiTipoDocDP.SetValue(this.fufArchivosDP.PostedFile.ContentType);
                hiTamanoDP.SetValue(this.fufArchivosDP.PostedFile.ContentLength);
                hiRutaDP.SetValue(nombre);
                hiTipoDP.SetValue(txtTipoDocumentoDP.Text);
            }
            else
                UtilP.MostrarNotificacion("Archivo no fue subido!!!", "Subir Archivo", MessageBox.Icon.ERROR);
        }
        catch (Exception)
        {
            UtilP.MostrarNotificacion("Archivo no fue subido!!!", "Subir Archivo", MessageBox.Icon.ERROR);
        }

    }

    public void SubirArchivoVT_Click(object sender, AjaxEventArgs e)
    {
        string mensaje = "Subido el archivo Correctamente: {0}<br/>Size: {1} bytes";
        try
        {
            string nombre = "";
            nombre = fufArchivosVT.PostedFile.FileName;
            nombre = UtilP.FormarNombre(nombre);
            fufArchivosVT.PostedFile.SaveAs(MapPath(string.Format("~/{0}{1}", ConfigurationManager.AppSettings.Get("PathFiles"), nombre)));
            fufArchivosVT.SetValue(nombre);

            if (this.fufArchivosVT.HasFile)
            {
                mensaje = string.Format("Subido el archivo Correctamente: {0}<br/>Size: {1} bytes", this.fufArchivosVT.PostedFile.FileName, this.fufArchivosVT.PostedFile.ContentLength);
                UtilP.MostrarNotificacion(mensaje, "Subir Archivo", MessageBox.Icon.INFO);

                hiTipoDocVT.SetValue(this.fufArchivosVT.PostedFile.ContentType);
                hiTamanoVT.SetValue(this.fufArchivosVT.PostedFile.ContentLength);
                hiRutaVT.SetValue(nombre);
                hiTipoVT.SetValue(txtTipoDocumentoVT.Text);
            }
            else
                UtilP.MostrarNotificacion("Archivo no fue subido!!!", "Subir Archivo", MessageBox.Icon.ERROR);
        }
        catch (Exception)
        {
            UtilP.MostrarNotificacion("Archivo no fue subido!!!", "Subir Archivo", MessageBox.Icon.ERROR);
        }
    }

    /// <summary>
    /// Limpia el formulario
    /// </summary>
    void LimpiarFormulario()
    {
        txtNombreProyecto.Reset();
        txaDescripcion.Reset();
        txtInversionTotal.Reset();
        txtPorcenContraparte.Reset();
        txtPorcenContraparte2.Reset();
        txtPorcenPlan.Reset();
        txtValContraparte.Reset();
        txtValContraparte2.Reset();
        txtValPlan.Reset();
        //cbxTipo.Reset();
        cbxRegion.Reset();
        cbxProvincia.Reset();
        cbxPrograma.Reset();
        txtLatitud.Reset();
        txtLongitud.Reset();
        cbxEjes.Reset();
        cbxCanton.Reset();
        txtParroquia.Reset();
        WinPerfilProyecto.Hide();
    }
    #endregion
}

